#pragma once
#include <cstdint>
#include <set>
#include <vector>
#include "nlohmann/json.hpp"

namespace xncc {
namespace config {
    constexpr int DEFAULT_ROTATE_MB = 512;
    constexpr int LOG_LEVEL_DEBUG   = 5;

    /*
    平台日志的配置
    */
    struct PlatformLog
    {
        std::string               LogPath    = "./";
        std::string               LogName    = "plat_log";
        int32_t                   LogLevel   = LOG_LEVEL_DEBUG;
        int32_t                   CoreId     = -1;
        uint32_t                  RotateSize = DEFAULT_ROTATE_MB;
        [[nodiscard]] std::string toStr() const;
    };
    /*
        单个环形队列
    */
    struct RingQueueInfo
    {
        int32_t                   Id;
        int32_t                   Size;
        bool                      AutoExpand;
        [[nodiscard]] std::string toStr() const;
    };
    /*
        业务线程的配置
    */
    struct PubInfo
    {
        int32_t                   QueueId;
        std::vector<int32_t>      MsgCodes;  // 向这个RB 发送的消息id 集合
        [[nodiscard]] std::string toStr() const;
    };
    /*
        业务线程的配置
    */
    struct BusiThreadInfo
    {
        int32_t                   Id;
        std::string               Name;
        std::vector<int32_t>      SubIds;  // 业务线程订阅的id集合
        std::vector<PubInfo>      PubIds;
        int32_t                   CoreId;
        int32_t                   IOMultiMode;  // IO复用模型
        [[nodiscard]] std::string toStr() const;
    };

    /*
        subserver线程的配置
    */
    struct SubServerThreadInfo
    {
        int32_t                   Id;
        std::string               Name;
        int32_t                   PubId;
        int32_t                   CoreId;
        int32_t                   IOMultiMode;  // IO复用模型
        [[nodiscard]] std::string toStr() const;
    };

    /*
        server线程的配置
    */
    struct ServerThreadInfo
    {
        int32_t                          Id;
        std::string                      Name;
        int32_t                          PubId;
        std::string                      Addr;
        int32_t                          CoreId;
        int32_t                          IOMultiMode;  // IO复用模型
        std::set<std::string>            BlackList;    // 黑名单
        std::vector<SubServerThreadInfo> SubServer;
        [[nodiscard]] std::string        toStr() const;
    };
    /*
        client线程的配置
    */
    struct ClientThreadInfo
    {
        int32_t                   Id;
        std::string               Name;
        int32_t                   PubId;
        std::string               Addr;
        bool                      ReConn;            // 是否重连 服务端模式不生效
        int32_t                   ReConnIntervalMs;  // 重连间隔 毫秒 服务端模式不生效
        int32_t                   CoreId;
        int32_t                   IOMultiMode;  // IO复用模型
        [[nodiscard]] std::string toStr() const;
    };
    /*
        平台层的配置信息, 保证最原始的配置信息，校验和过滤后续进行
    */
    struct PlatformInfo
    {
        PlatformLog                   LogInfo;
        std::vector<RingQueueInfo>    RingQueues;
        std::vector<BusiThreadInfo>   BusiThreads;
        std::vector<ServerThreadInfo> ServerThreads;
        std::vector<ClientThreadInfo> ClientThreads;
        [[nodiscard]] std::string     toStr() const;
    };

    /*
        json反序列化到obj的实现
    */
    void from_json(const nlohmann::json& json, PlatformLog& obj);

    void from_json(const nlohmann::json& json, RingQueueInfo& obj);

    void from_json(const nlohmann::json& json, PubInfo& obj);

    void from_json(const nlohmann::json& json, BusiThreadInfo& obj);

    void from_json(const nlohmann::json& json, SubServerThreadInfo& obj);

    void from_json(const nlohmann::json& json, ServerThreadInfo& obj);

    void from_json(const nlohmann::json& json, ClientThreadInfo& obj);

    void from_json(const nlohmann::json& json, PlatformInfo& obj);
}  // namespace config
}  // namespace xncc